package com.cn.aam.checaiduo.backend.api;

import com.cn.aam.checaiduo.base.AppConfigB;
import com.cn.aam.checaiduo.bean.AgreementB;
import com.cn.aam.checaiduo.bean.AuthResultB;
import com.cn.aam.checaiduo.bean.AvatarB;
import com.cn.aam.checaiduo.bean.BannerB;
import com.cn.aam.checaiduo.bean.BuyPreDataB;
import com.cn.aam.checaiduo.bean.IndexB;
import com.cn.aam.checaiduo.bean.ProductDetailB;
import com.cn.aam.checaiduo.bean.ProductItemB;
import com.cn.aam.checaiduo.bean.ReservationB;
import com.cn.aam.checaiduo.bean.UpdateInfoB;
import com.cn.aam.checaiduo.bean.base.BaseResponseB;
import com.cn.aam.checaiduo.bean.base.NormalResponseB;
import com.cn.aam.checaiduo.bean.base.PageB;
import com.cn.aam.checaiduo.bean.brandsquence.BrandSequenceDataB;
import com.cn.aam.checaiduo.bean.me.InvestOrderDetailB;
import com.cn.aam.checaiduo.bean.me.InvestRecordB;
import com.cn.aam.checaiduo.bean.me.InviteB;
import com.cn.aam.checaiduo.bean.me.MeFinanceB;
import com.cn.aam.checaiduo.bean.me.NoticeB;
import com.cn.aam.checaiduo.bean.me.PointB;
import com.cn.aam.checaiduo.bean.me.PointDetailB;
import com.cn.aam.checaiduo.bean.me.PointMallB;
import com.cn.aam.checaiduo.bean.me.RechageB;
import com.cn.aam.checaiduo.bean.me.RedirectContentB;
import com.cn.aam.checaiduo.bean.me.VoucherB;
import com.cn.aam.checaiduo.bean.me.WithDrawB;
import com.cn.aam.checaiduo.bean.other.BasicUserInfoB;
import com.cn.aam.checaiduo.bean.pay.PayResultB;
import com.cn.aam.checaiduo.bean.redirect.PutOrderB;

import java.util.List;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Query;

/**
 * monker on 2017/5/26.
 */

public interface InternalApi {
    /**
     * 四、我的理财接口
     *
     * @return
     */
    @GET("Wap/InternalApi/appFinance")
    Observable<NormalResponseB<MeFinanceB>> appFinance(@Query("token") String token);

    /**
     * @param pageNo    第几页，默认为第1页
     * @param pageSize  分页大小，默认为10
     * @param startDate 此日期之后记录，格式为： YYYY-MM-
     * @param endDate   此日期之前记录，格式为： YYYY-MM-DD
     * @param type      类型，1：已回款记录，2：销售中记录，默认为全部记录
     * @description 投资记录列表
     */
    @GET("Wap/InternalApi/getInvestList")
    Observable<PageB<InvestRecordB>> getInvestList(@Query("page_no") String pageNo,
                                                   @Query("page_size") String pageSize,
                                                   @Query("start_date") String startDate,
                                                   @Query("end_date") String endDate,
                                                   @Query("type") String type,
                                                   @Query("token") String token);


    /**
     * 充值记录
     */
    @GET("Wap/InternalApi/getRechargeList")
    Observable<PageB<RechageB>> getRechargeList(@Query("page_no") String pageNo,
                                                @Query("page_size") String pageSize,
                                                @Query("start_date") String startDate,
                                                @Query("end_date") String endDate,
                                                @Query("token") String token);


    /**
     * 提现记录
     */
    @GET("Wap/InternalApi/getWithdrawList")
    Observable<PageB<WithDrawB>> getWithdrawList(@Query("page_no") String pageNo,
                                                 @Query("page_size") String pageSize,
                                                 @Query("start_date") String startDate,
                                                 @Query("end_date") String endDate,
                                                 @Query("token") String token);


    /**
     * @param category  众筹产品类别，1-浮动收益，2-固定收益，默认包括全部类别
     * @param brand     汽车品牌，如宝马、奔驰
     * @param sequence  期数，如3、10、105
     * @param type      Crowdfunding：众筹中，saling：销售中，rewarded：已回款，默认包括全部以上全部类型
     * @param startDate 该日期后众筹车辆，格式为： YYYY-MM-DD
     * @param endDate   该日期前众筹车辆，格式为： YYYY-MM-DD
     * @param start_id  指定范围内起始标的id
     * @param end_id    指定范围内终止标的id
     * @param pageNo    第几页，默认为第1页
     * @param pageSize  每页数量，默认为10
     * @description 获取项目列表
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/getCrowdfundingList")
    Observable<PageB<ProductItemB>> getProductList(@Field("category") String category,
                                                   @Field("brand") String brand,
                                                   @Field("sequence") String sequence,
                                                   @Field("type") String type,
                                                   @Field("start_date") String startDate,
                                                   @Field("end_date") String endDate,
                                                   @Field("start_id") String start_id,
                                                   @Field("end_id") String end_id,
                                                   @Field("start_sequence") String start_sequence,
                                                   @Field("end_sequence") String end_sequence,
                                                   @Field("page_no") String pageNo,
                                                   @Field("page_size") String pageSize);

    /**
     * @param type
     * @description 获取banne列表
     * @remark retrofit规定post至少需要一个Field
     */

    @GET("Wap/InternalApi/bannerList")
    Observable<PageB<BannerB>> getBannerList(@Query("type") String type);


    /**
     * @param id 产品id
     * @description 获取产品详情页
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/getCrowdfundingDetail")
    Observable<NormalResponseB<ProductDetailB>> getProductDetail(@Field("crowdfunding_id") String id);

    /**
     * 提现记录
     */
    @GET("Wap/InternalApi/getOrderDetail")
    Observable<NormalResponseB<InvestOrderDetailB>> getOrderDetail(@Query("token") String token, @Query("order_id") String order_no);


    /**
     * @description 获取前十标的品牌和众筹期数分段
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/brandAndSequence")
    Observable<BrandSequenceDataB> getCardBrandList(@Field("ignore") String ignore);


    /**
     * @description 获取抵用券
     */
    @GET("Wap/InternalApi/queryCoupon")
    Observable<NormalResponseB<VoucherB>> queryCoupon(@Query("token") String token);

    /**
     * @param amount 充值金额
     * @description 充值
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/recharge")
    Observable<RedirectContentB> recharge(@Field("token") String token, @Field("amount") String amount);

    /**
     * @param amount 提现金额
     * @description 提现
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/withdraw")
    Observable<RedirectContentB> withdraw(@Field("token") String token, @Field("amount") String amount);

    /**
     * @description 实名认证
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/auth")
    Observable<AuthResultB> auth(@Field("token") String token,
                                 @Field("realname") String realname,
                                 @Field("cardId") String cardId,
                                 @Field("mobile") String mobile);


    /**
     * @param crowdfunding 标的id
     * @param order_amount 订单金额
     * @param with_balance 是否有余额支付，默认是
     * @param cash_coupon  使用的代金券id
     * @param rate_coupon  使用的加息券id
     * @description 提交订单
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/postOrder")
    Observable<PutOrderB> postOrder(@Field("token") String token,
                                    @Field("crowdfunding") String crowdfunding,
                                    @Field("order_amount") String order_amount,
                                    @Field("with_balance") String with_balance,
                                    @Field("cash_coupon") String cash_coupon,
                                    @Field("rate_coupon") String rate_coupon);

    /**
     * @param order_id 订单ID
     * @description 支付订单
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/pay")
    Observable<RedirectContentB> pay(@Field("token") String token,
                                     @Field("order_id") String order_id
    );

    /**
     * @param order_id 订单ID
     * @description 支付结果
     */
    @GET("Wap/InternalApi/payResult")
    Observable<NormalResponseB<PayResultB>> payResult(@Query("token") String token,
                                                      @Query("order_id") String order_id);

    /**
     * @description 预约投资
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/createAutoTender")
    Observable<RedirectContentB> autoTender(@Field("token") String token,
                                            @Field("auto_tender_amount") String auto_tender_amount);


    /**
     * @description 获取投资前数据
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/getPreInvestData")
    Observable<NormalResponseB<BuyPreDataB>> getPreInvestData(@Field("token") String token,
                                                              @Field("crowdfunding_id") String id);


    /**
     * @description 预约记录列表
     */
    @GET("Wap/InternalApi/getAutoTenderList")
    Observable<NormalResponseB<List<ReservationB>>> getAutoTenderList(@Query("token") String token);

    /**
     * @description 取消预约
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/cancelAutoTender")
    Observable<BaseResponseB> cancelAutoTender(@Field("token") String token,
                                               @Field("autotender") String autotender);

    /**
     * @description 新浪钱包
     */
    @GET("Wap/InternalApi/wallet")
    Observable<RedirectContentB> getWallet(@Query("token") String token);

    /**
     * @description 系统公告
     */
    @GET("Wap/InternalApi/notify")
    Observable<NormalResponseB<List<NoticeB>>> getNotify(@Query("token") String token);

    /**
     * @description 公告已阅读
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/readNotify")
    Observable<BaseResponseB> readNotify(@Field("token") String token, @Field("notify_id") String notify_id);


    /**
     * @description 投资电子协议
     */
    @GET("Wap/InternalApi/agreement")
    Observable<AgreementB> getAgreement(@Query("token") String token, @Query("order") String order);

    /**
     * @description 获取积分商城入口url
     */
    @GET("Wap/InternalApi/pointMall")
    Observable<PointMallB> pointMall(@Query("token") String token);

    /**
     * @description 获取积分
     */
    @GET("Wap/InternalApi/point")
    Observable<PointB> getPoint(@Query("token") String token);


    /**
     * @description 获取积分明细
     */
    @GET("Wap/InternalApi/pointDetail")
    Observable<PageB<PointDetailB>> getPointDetail(@Query("token") String token,
                                                   @Query("page") String page,
                                                   @Query("page_size") String pageSize,
                                                   @Query("year") String year,
                                                   @Query("type") String type,
                                                   @Query("start_date") String start_date,
                                                   @Query("end_date") String end_date);

    /**
     * @description 更多-获取用户基本信息
     */
    @GET("Wap/InternalApi/more")
    Observable<NormalResponseB<BasicUserInfoB>> getBasicUserInfo(
            @Query("token") String token);

    /**
     * @description 签到
     */
    @GET("Wap/InternalApi/signin")
    Observable<PointB> signin(@Query("token") String token);


    /**
     * 获取验证码【修改手机号】
     * 通用：旧手机，新手手机
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/refreshSmscode")
    Observable<BaseResponseB> getSMSCode(
            @Field("mobile") String mobile);

    /**
     * 验证旧手机号码---验证码
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/verifySmsCode")
    Observable<BaseResponseB> verifyOldPhoneSmsCode(
            @Field("verify_code") String verify_code);


    /**
     * 验证新手机号码---验证码
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/resetMobile")
    Observable<BaseResponseB> verifyCodeForChangeMobile(
            @Field("token") String token,
            @Field("verify_code") String verify_code,
            @Field("old_mobile") String old_mobile,
            @Field("new_mobile") String new_mobile);


    /**
     * @param sms 0-关闭短信提醒，1-打开短信提醒
     *            修改手机号--更新短信开关
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/updateSMS")
    Observable<BaseResponseB> updateSMS(
            @Field("token") String token,
            @Field("sms") String sms);


    /**
     * 修改登录密码
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/changePassword")
    Observable<BaseResponseB> changePassword(
            @Field("token") String token,
            @Field("password") String password,
            @Field("new_password") String new_password);


    /**
     * 获取配置信息-是否关闭短信提醒
     */
    @FormUrlEncoded
    @POST("Wap/InternalApi/appConfig")
    Observable<NormalResponseB<AppConfigB>> getAppConfig(
            @Field("token") String token);

    /**
     * 上传头像
     */
    @Multipart
    @POST("Wap/InternalApi/postAvatar")
    Observable<NormalResponseB<AvatarB>> postAvatar(@Part MultipartBody.Part token, @Part MultipartBody.Part avatar);


    /**
     * @description 首页信息
     */
    @GET("Wap/InternalApi/indexInfo")
    Observable<NormalResponseB<IndexB>> indexInfo(@Query("token") String token);

    /**
     * @description 邀请有奖
     */
    @GET("Wap/InternalApi/inviteInfo")
    Observable<NormalResponseB<InviteB>> inviteInfo(@Query("token") String token);


    /**
     * 获取最新apk信息
     */
    @GET("Wap/InternalApi/checkAndroidVersion")
    Observable<NormalResponseB<UpdateInfoB>> checkAndroidVersion();



}
